Erlang SyncML server За неделю двухчасовых полежалок перед сном мне удалось сделать следующее: у меня есть сервер который принимает SyncML запросы по HTTP протоколу в текстовом или бинарном формате. Я решительно пока остаюсь на XML парсере от Джо Армстронга, который занимает 36К, а также с iServe который занимает 16К. Также для декодирования бинарных WBXML я использую библитеотеку wbxml (36КБ) из sowap.sf.net пропатченную до поддержки syncml, metinf, devinf DTD. А для декодирования UNICODE библиотеку ucs (36КБ+таблицы на 3МБ) того же автора. Если у вас есть SyncML устройство (практически любой современный телефон Нокиа), вы можете законектится на мой сервер с любым логином и паролем по адресу: http://synrc.com:2500 логи парсера в онлайне вы можете наблюдать на http://synrc.com/sync/server/synclog.htm. Парсер немного лоховат, некоторые запросы с vcard внутри тела, пока не проходят, но это пока. А вот как выглядит код моего сервера: -module(syncserver). -author('Maxim Sokhatsky '). -export([iserve_request/2,start/0]). -include("iserve/include/iserve.hrl"). start() -> application:start(ucs), iserve_server:start(2500, ?MODULE). iserve_request(C, Req) -> {req,Con,Len,V,M,Uri,Args,Headers,Body} = Req, case M of 'POST' -> {Val,{CTypeC,CType}} = lists:keysearch('Content-Type',1,Headers), io:format("

Content Type: ~p

",[CType]), {ok,DTD} = file:read_file("syncml_12.dtd"), XMLBin = erlang:binary_to_list(Body), case CType of "application/vnd.syncml+xml" -> XML = XMLBin, io:format("

Incoming Text ~p

~n
~s
~n",[erlang:now(),xml_print:pp(XML)]); "application/vnd.syncml+wbxml" -> io:format("

Incoming Binary ~p

~n
~p
~n",[erlang:now(),XMLBin]), {ok,XML} = wbxml:decode(XMLBin) end, DTDXML = erlang:binary_to_list(DTD) ++ XML, {ok,Warnings,Rules,Parse} = xml:bin(erlang:list_to_binary(DTDXML)), handle_syncml_message(Parse), io:format("

Parse tree

~n

~s
~n", [xml_print:pp(Parse)]), iserve:reply_ok([{'Content-Type', "text/plain;charset=utf-8"}], <<>>) end. Репозиторий проекта на http://synrc.com/repository/sync/server